The present disclosure generally relates to integrated development environments for development of software source code, and more particularly relates to an information processing system that interactively guides implementation of source code based on programming design objectives.
In the domain of high performance and big data applications, developers want to write code that can exploit the advanced optimization and safety features provided by these types of compilers and runtime environments. For example, for distributed runtime systems used to process “Big Data”, it's often advantageous for developers to exploit optimizations such as parallelizing the execution of code and relocating executing code between hosts at runtime. Similarly, some languages and specialized runtime environments (such as IBM InfoSphere Streams™) supports safety features such as saving and restoring program state. Writing software that can exploit these features is often critical in realizing cost, performance and stability objectives that are typical of applications that perform securities trading, industrial control systems (SCADA), real-time sentiment analysis, order fulfillment, and so on. However, writing source code that can exploit these features typically requires the developer to adhere to a set of subtle, non-obvious and intricate constraints. For example, to implement software that can be automatically parallelized by the application runtime, the developer needs to ensure that the code is not dependent on preserved state across program executions, or that the preserved state is defined in such a way that the runtime can automatically partition the state between the parallel instances of the executing code. In practice, many developers are not expert at the art of implementing such code, and popular programming languages (e.g. Java, C++) do not provide explicit support for enabling auto parallelization, for example. Enabling these capabilities may require the user to adhere to subtle, non-obvious, and intricate constraints on how they implement their code.
For example, consider a scenario where a software developer wants to write code that can be parallelized (by the compiler and runtime environment). An architecture design choice for that software (or a code segment thereof) that maintains a persistent state may make the code non-parallelizable. As another example, consider a scenario where a software developer wants to write code that is deterministic and will always generate the same results given the same input. A software design choice that always uses absolute time values may make the code non-deterministic.
Understanding implications of code design structure, features, and functions, and the associated run time behavior, in meeting design objectives (e.g., runtime parallelism or deterministic results) can be very challenging. Knowing how to achieve optimization and safety objectives may require deep expertise.
Using currently available methods and tools, developers often resort to a prolonged trial and error process to implement software that exploits the optimization and safety capabilities referenced in the above examples. That is, developers write code that seems to implement the design objectives, submit the application to the runtime environment, and observe any undesirable behavior and/or errors that result. The developer will then attempt to infer required changes to the source code, and re-test the application. While this iterative process is similar to a code-debug cycle, it is typically much less effective: it's challenging for the developer to infer the required code changes, and to ensure that their code is fully exploiting the capabilities provided by the compiler and runtime.
Current code development requires iterative trial and error to try to solve these types of problems with code design structure, features, and functions, and the associated run time behavior, failing to meet design objectives. Typically, a developer implements code with some design objective in mind (e.g., runtime parallelization). The developer then receives warning and error messages from a compiler and/or a runtime environment, e.g., if the code can't be parallelized. The developer then fixes the code to correct according to the error messages. The developer then re-tests. During the iterative development process, unfortunately, the warning and error messages to the developer may not clearly describe the design objectives that the developer's code failed to meet. There is little guidance to the developer for writing code that conforms to the design objectives. Knowing how to achieve optimization and safety objectives could require deep expertise in software architecture design choices implemented in the code.